package leetcode_day._2021._202104._1120;

/**
 * @author yzh
 * @version 1.0
 * @date 2021/4/19 10:38
 * 移除元素
 * 双指针
 * 设置两个指针 l r
 * r 无条件移动 , 使用 for 循环后 , r 就是 i
 * nums[r] != val , l 移动
 * <p>
 * 前面是两个指针同时指向首位，可以一个指向首位，一个指向末尾
 * 因为题目没有要求数组顺序
 * 这里 l 无条件移动 , r 当 nums[l] = val 时 , 向左移动
 * 这里的 l 无条件移动是错的 , 只有当 nums[l] != val 时 , l 才向右移动
 * 当 nums[l] = val 时 , 虽然 nums[l] = nums[r] , 但仍有可能 nums[l] = val , 所以不能移动
 * 注意 : 这里的 r 要从 nums.length 开始 , 不然 l 会少一个
 * 如果强行让 l + 1 , 那么当 nums = [1] , val = 1 时 , 就会报错
 */
public class _19_27 {
    public static void main(String[] args) {
        int[] nums = {0, 1, 2, 2, 3, 0, 4, 2};
        System.out.println(new _19_27().removeElement_another(nums, 2));
    }

    public int removeElement_another(int[] nums, int val) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            if (nums[l] == val) {
                nums[l] = nums[r];
                --r;
            }
            else ++l;
        }
        System.out.println(r);
        return l;
    }

    public int removeElement(int[] nums, int val) {
        int l = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[l] = nums[i];
                ++l;
            }
        }
        return l;
    }
}
